package com.han.hotelplat.quartz;

import java.util.Date;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSONObject;
import com.allinpay.xmltrans.pojo.TranxCon;
import com.allinpay.xmltrans.service.TranxServiceImpl;
import com.han.hotelplat.comm.Constant;
import com.han.hotelplat.comm.utils.DateUtil;
import com.han.hotelplat.pojo.cashextract.CashExtract;
import com.han.hotelplat.pojo.wallet.Wallet;
import com.han.hotelplat.service.bill.BillService;
import com.han.hotelplat.service.cashextract.CashExtractService;
import com.han.hotelplat.service.wallet.WalletService;

/**
 * 
	 ***************************************************************
	 * <p>
	 * @CLASS				:	TaskQuartz 任务相关定时器
	 * @DESCRIPTION	:	
	 * @AUTHOR				:	han1088
	 * @VERSION			:	v1.0
	 * @DATE					:	2018年3月12日 下午3:40:58            
	 * </p>
	 * 
	 * <p>
	 * @MODIFY	LOG	:		
	 * @AUTHOR				:	han1088
	 * @VERSION			:	v1.0
	 * @MODIFY DATE	:	
	 * </p>    
	 ****************************************************************
 */

/**
 * 业务相关的作业调度
 * 
           字段               允许值                           允许的特殊字符
	秒	 	0-59	 	, - * /
	分	 	0-59	 	, - * /
	小时	 	0-23	 	, - * /
	日期	 	1-31	 	, - * ? / L W C
	月份	 	1-12 或者 JAN-DEC	 	, - * /
	星期	 	1-7 或者 SUN-SAT	 	, - * ? / L C #
	年（可选）	 	留空, 1970-2099	 	, - * /
	
	*  字符代表所有可能的值
	/  字符用来指定数值的增量
	L  字符仅被用于天（月）和天（星期）两个子表达式，表示一个月的最后一天或者一个星期的最后一天
	6L 可以表示倒数第６天
	
 *
 */
@Component
public class CashExtractQuartz {
	
	@Autowired
	private BillService billService;
	@Autowired
	private CashExtractService cashExtractService;
	@Autowired
	private WalletService walletService;
	
	/**
	 *发起交易查询
	 * 每隔6分钟启动一次
	 */
	@Scheduled(cron = "0 */7 * * * ?")  
	public void querCashExtract(){
		int state = Constant.CE_STATE_WAIT_QUERY;//提交通联提现请求失败的
		List<CashExtract> data = cashExtractService.findCashEx(null, state, null, null, null);
		TranxServiceImpl tranxService=new TranxServiceImpl();
		boolean isfront=false;//是否发送至前置机（由前置机进行签名）如不特别说明，商户技术不要设置为true
		for(CashExtract ce : data){
			try {
				String reqsn = ce.getReqsn();
				Map<String, Object> re = tranxService.queryTradeNew(TranxCon.tranURL, reqsn, isfront, "2018-08-29 11:51:33", "2018-08-29 17:42:00",Constant.pfxPath,Constant.tltcerPath);
				int code = (int) re.get("code");
				String message = (String) re.get("message");
				if(code == 0){
					CashExtract oldce = cashExtractService.findCashExById(ce.getId());
					oldce.setEdittime(new Date());
					oldce.setState(Constant.CE_STATE_SUCCESS);
					oldce.setRemark(oldce.getRemark()==null?"":oldce.getRemark()+";"+message);
					cashExtractService.update(oldce);
					Wallet w = walletService.getWallet(oldce.getUserid());
					//如果提现成功要修改流水记录里面的状态
					billService.updateBill(w.getId(), oldce.getId()+"="+Constant.CE_STATE_CREAT);
				}else if(code ==1){//需要发起查询的提现请求
					CashExtract oldce = cashExtractService.findCashExById(ce.getId());
					oldce.setEdittime(new Date());
					oldce.setState(Constant.CE_STATE_WAIT_QUERY);
					oldce.setRemark(oldce.getRemark()==null?"":oldce.getRemark()+";"+message);
					cashExtractService.update(oldce);
				}else{
					CashExtract oldce = cashExtractService.findCashExById(ce.getId());
					oldce.setEdittime(new Date());
					oldce.setState(Constant.CE_STATE_FAIL);
					oldce.setRemark(oldce.getRemark()==null?"":oldce.getRemark()+";"+message);
					cashExtractService.update(oldce);
					
					
					//失败后恢复额度
					Wallet w = walletService.getWallet(oldce.getUserid());
					String taskId = oldce.getId().toString()+"="+Constant.CE_STATE_FAIL;//提现申请的ID=状态
					billService.creatBill(null, w.getId(), oldce.getMoney()+1, 
							Constant.BILL_TYPE_CASH,"提现失败;"+message, taskId, null, Constant.CHARGE_CHANNEL_TRANSFER,
							"转账系统");
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
